#include <QGuiApplication> // QGuiApplication：提供 GUI 应用程序主对象，适用于只用 QML 构建界面（不使用 QWidget）
#include <QQmlApplicationEngine> // QQmlApplicationEngine：用于加载并运行 QML 文件（通常是主界面）

int main(int argc, char *argv[])
{
    /*
     * 启用高 DPI 缩放支持。
        在高分辨率显示器上可以自动放大 UI 元素，防止看起来太小。
        这是在 QCoreApplication 层设置的全局属性，必须在 QGuiApplication 实例化之前设置。
     * */
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    /*
     * 创建一个 QGuiApplication 应用实例。
     * 它是 Qt 中用于 GUI 应用程序的核心对象，负责事件循环、全局设置等。
     * */
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine; // 创建 QML 引擎 engine，用于加载和运行 QML 文件。

    /*
     * 设置 QML 文件的加载路径：
     * 使用 QStringLiteral 提升字符串性能。
     * 使用 qrc:/ 表示从资源文件（Qt Resource System）中加载 main.qml。
     * main.qml 文件应当已通过 .qrc 文件加入资源系统。
     * */
    const QUrl url(QStringLiteral("qrc:/main.qml"));

    /*
     * 建立一个信号槽连接，用于检测 QML 是否加载成功：
     * engine 发出 objectCreated 信号时，触发 lambda 表达式。
     * obj 为 nullptr 表示加载失败（如 main.qml 文件出错或未找到）。
     * 如果失败则立即退出应用，返回值为 -1。
     * 使用 Qt::QueuedConnection 保证在事件队列中按顺序调用。
     * */
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);

    //正式加载 QML 文件，启动 UI。
    //如果 main.qml 加载失败，就不会创建 root object，触发上面连接中的槽函数。
    engine.load(url);

    //启动 Qt 应用程序的事件循环（Event Loop），直到用户关闭程序。
    //app.exec() 是整个程序的核心阻塞点，不调用它程序不会运行事件处理。
    return app.exec();
}
